﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DoveyDelegateEvent
{
    /// <summary>
    /// delegate 委托
    /// 
    /// 就是一个类、为什么要用委托呢？
    /// 这个类的实例可以放入一个方法，实例invoke时，就可以调用这个方法
    /// 
    /// 说起来还是再执行方法，为啥做成三个步骤？唯一的差别：就是把方法当参数传入
    /// 
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            {
                Student stu = new Student()
                {
                    Id = 1,
                    Name = "Dovey"
                };
                //stu.SayHi("李好");

                //stu.SayHiByCountry("李浩", PersonType.Chinese);


                //stu.SayHiByCountry("Shero", PersonType.American);


            }

            {
                //Student zhangsan = new Student()
                //{
                //    Name = "zhangsan",
                //    Id = 1
                //};
                ////{
                ////    Handler handler = new Handler(zhangsan.ChineseSayHi);
                ////    zhangsan.SayHiEveryOne("李浩", handler);
                ////}
                //{
                //    //Handler handler = new Handler(zhangsan.ChineseSayHi);

                //    zhangsan.SayHiEveryOneAction("李浩", zhangsan.ChineseSayHi);
                //}

                //Student james = new Student()
                //{
                //    Name = "james",
                //    Id = 1
                //};
                //{
                //    Handler handler = new Handler(james.AmericanSayHi);
                //    james.SayHiEveryOne("Lisa", handler);
                //}
                //{
                //    james.SayHiEveryOneAction("Lisa", james.AmericanSayHi);
                //}

                //Student ABC = new Student()
                //{
                //    Name = "ABC",
                //    Id = 1
                //};

                //{
                //    Handler handler = new Handler(ABC.AnyOneSayHi);
                //    ABC.SayHiEveryOne("@@", handler);
                //    ABC.SayHiEveryOneAction("##", ABC.AnyOneSayHi);
                //}
                {
                    new Program().Show();
                }  

                // 事件：Event 一个委托的实例，带一个event关键字
                // 限制权限，只允许在事件声明类里面去invoke和赋值，不允许外面，甚至子类
                // 事件和委托的区别与联系？
                // 委托是一种类型，事件是委托类型的一个实例，加上了event的权限控制
                // Student是一种类型，Tony就是Student类型的一个实例
            }
        }
        public void Show() {
            {
                Action action = new Action(this.DoSomething);
                action();
                Func<int> func = new System.Func<int>( DoInt);
                func();
                Func<int> func2 =  DoInt;
                func2();

                // 多播委托
                func2 += DoInt;
                func2();

            }
        }

        public void DoSomething() {
            Console.WriteLine("DoSomething");

        }
        public int DoInt() {
            Console.WriteLine("DoInt");
            return 1;
        }
    }
}
